package gruppo12.msp.elaboration;

import java.io.Serializable;
import java.util.ArrayList;

/**
 * <p>
 * Classe che gestisce tutte i dati inerenti alle categorie che saranno gestite
 * dal software
 * </p>
 * 
 * @author Antonio Duca, Jacopo Festa, Domenico Fiorilli, Dante Granese, Saverio
 *         Lemma, Marco Lombardi e Fiore Pierno
 * 
 */
public class Categoria implements Serializable {

	private static final long serialVersionUID = 5827192064539582335L;

	private String stringaNomeCategoria;
	private String stringaMacroCategoria;
	private int percentuale;
	private float tempoStimato;
	private boolean categoriaSelezionata;
	private int numPDIVisualizzati;
	private ArrayList<PDI> elencoPDI;

	/**
	 * Costruttore della classe
	 * 
	 * @param stringaNomeCategoria
	 *            il nome della categoria
	 * @param stringaMacroCategoria
	 *            la macrocategoria a cui appartiene la categoria
	 */
	public Categoria(String stringaNomeCategoria, String stringaMacroCategoria) {
		this.stringaNomeCategoria = stringaNomeCategoria;
		this.stringaMacroCategoria = stringaMacroCategoria;
	}

	/**
	 * Metodo che ritorna il nome della categoria
	 * 
	 * @return il nome della categoria
	 */
	public String getNomeCategoria() {
		return stringaNomeCategoria;
	}

	/**
	 * Metodo che imposta il nome della categoria
	 * 
	 * @param stringaNomeCategoria
	 *            il nome della categoria
	 */
	public void setNomeCategoria(String stringaNomeCategoria) {
		this.stringaNomeCategoria = stringaNomeCategoria;
	}

	/**
	 * Metodo che ritorna la macrocategoria relativa ad una categoria
	 * 
	 * @return macrocategoria di appartenenza ad una categoria
	 */
	public String getMacroCategoria() {
		return stringaMacroCategoria;
	}

	/**
	 * Metodo che imposta la macrocategoria relativa ad una categoria
	 * 
	 * @param stringaMacroCategoria
	 *            la macrocategoria relativa ad una categoria
	 */
	public void setMacroCategoria(String stringaMacroCategoria) {
		this.stringaMacroCategoria = stringaMacroCategoria;
	}

	/**
	 * Metodo che preleva la percentuale relativa ad una categoria
	 * 
	 * @return la percentuale relativa ad una categoria
	 */
	public int getPercentuale() {
		return percentuale;
	}

	/**
	 * Metodo che imposta la percentuale relativa ad una categoria
	 * 
	 * @param percentuale
	 *            la percentuale relativa ad una categoria
	 */
	public void setPercentuale(int percentuale) {
		if (percentuale < 0 || percentuale > 100)
			throw new IllegalArgumentException(
					"La percentuale deve essere compresa tra 0 e 100; valore non valido: "
							+ percentuale);
		this.percentuale = percentuale;
	}

	/**
	 * Metodo che preleva il tempo stimato necessario per la visita di un PDI
	 * relativo ad una categoria
	 * 
	 * @return il tempo stimato necessario per la visita di un PDI relativo ad
	 *         una categoria
	 */
	public float getTempoStimato() {
		return tempoStimato;
	}

	/**
	 * Metodo che imposta il tempo stimato necessario per la visita di un PDI
	 * relativo ad una categoria
	 * 
	 * @param tempoStimato
	 *            il tempo stimato necessario per la visita di un PDI relativo
	 *            ad una categoria
	 */
	public void setTempoStimato(float tempoStimato) {
		this.tempoStimato = tempoStimato;
	}

	/**
	 * Metodo che ritorna il numero di PDI da visualizzare per una categoria
	 * 
	 * @return numero di PDI da visualizzare per una categoria
	 */
	public int getNumPDIVisualizzati() {

		if (elencoPDI.size() > numPDIVisualizzati)
			return numPDIVisualizzati;
		return elencoPDI.size();
	}

	/**
	 * Metodo che imposta il numero di PDI da visualizzare per una categoria
	 * 
	 * @param numPDIVisualizzati
	 *            numero di PDI da visualizzare per una categoria
	 */
	public void setNumPDIVisualizzati(int numPDIVisualizzati) {
		this.numPDIVisualizzati = numPDIVisualizzati;
	}

	/**
	 * Metodo che indica se una categoria � stata selezionata
	 * 
	 * @return booleano per indicare la selezione
	 */
	public boolean isCategoriaSelezionata() {
		return categoriaSelezionata;
	}

	/**
	 * Metodo che imposta la selezione di una categoria
	 * 
	 * @param categoriaSelezionata
	 *            booleano per indicare la selezione
	 */
	public void setCategoriaSelezionata(boolean categoriaSelezionata) {
		this.categoriaSelezionata = categoriaSelezionata;
	}

	/**
	 * Metodo che restituisce un elenco di PDI data una categoria
	 * 
	 * @return elenco di PDI per categoria
	 */
	public ArrayList<PDI> caricaElencoPDI() {
		return elencoPDI;
	}

	/**
	 * Metodo che imposta un elenco di PDI data una categoria
	 * 
	 * @param elencoPDI
	 *            elenco di PDI per categoria
	 */
	public void setElencoPDI(ArrayList<PDI> elencoPDI) {
		this.elencoPDI = elencoPDI;
	}

	/**
	 * Metodo che aggiunge un PDI
	 * 
	 * @param pdi
	 *            PDI da aggiungere
	 */
	public void aggiungiPDI(PDI pdi) {
		elencoPDI.add(pdi);
	}

	/**
	 * Metodo che ritorna il numero di PDI per ogni categoria
	 * 
	 * @return il numero di PDI per categoria
	 */
	public int getNumPDICategoria() {
		/*
		 * Dalla categoria si preleva l'arraylist del PDI relativo e se ne
		 * calcola la dimensione
		 */
		if (elencoPDI.isEmpty())
			return 0;
		return elencoPDI.size();
	}
}